﻿using Microsoft.Xna.Framework;
////////////////////////////////////////////////////////////////////////////
using Microsoft.Xna.Framework.Graphics;
////////////////////////////////////////////////////////////////////////////

namespace TomShane.Neoforce.Controls
{
    public class ImageButton : ButtonBase
    {
        #region //// Consts ////////////

        ////////////////////////////////////////////////////////////////////////////
        private const string skButton = "Button";
        private const string lrButton = "Control";
        ////////////////////////////////////////////////////////////////////////////

        #endregion

        #region //// Fields ////////////

        ////////////////////////////////////////////////////////////////////////////              
        private ModalResult modalResult = ModalResult.None;
        private ButtonMode mode = ButtonMode.Normal;
        private bool pushed = false;
        private Texture2D image = null;
        private Texture2D pressImage = null;
        ////////////////////////////////////////////////////////////////////////////

        #endregion

        #region //// Properties ////////

        ////////////////////////////////////////////////////////////////////////////    
        public Texture2D Image
        {
            get { return image; }
            set
            {
                image = value;
                Invalidate();
            }
        }
        ////////////////////////////////////////////////////////////////////////////

        ////////////////////////////////////////////////////////////////////////////    
        public Texture2D PressImage
        {
            get { return pressImage; }
            set
            {
                pressImage = value;
                Invalidate();
            }
        }
        ////////////////////////////////////////////////////////////////////////////

        ////////////////////////////////////////////////////////////////////////////
        public ModalResult ModalResult
        {
            get { return modalResult; }
            set { modalResult = value; }
        }
        ////////////////////////////////////////////////////////////////////////////

        ////////////////////////////////////////////////////////////////////////////
        public ButtonMode Mode
        {
            get { return mode; }
            set { mode = value; }
        }
        ////////////////////////////////////////////////////////////////////////////

        ////////////////////////////////////////////////////////////////////////////
        public bool Pushed
        {
            get { return pushed; }
            set
            {
                pushed = value;
                Invalidate();
            }
        }
        ////////////////////////////////////////////////////////////////////////////

        #endregion

        #region //// Events ////////////

        ////////////////////////////////////////////////////////////////////////////                 
        public event TomShane.Neoforce.Controls.EventHandler GlyphChanged;
        ////////////////////////////////////////////////////////////////////////////

        #endregion

        #region //// Construstors //////

        ////////////////////////////////////////////////////////////////////////////       
        public ImageButton(Manager manager)
            : base(manager)
        {
            SetDefaultSize(72, 24);
        }
        ////////////////////////////////////////////////////////////////////////////

        #endregion

        #region //// Destructors ///////

        ////////////////////////////////////////////////////////////////////////////
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
            }
            base.Dispose(disposing);
        }
        ////////////////////////////////////////////////////////////////////////////

        #endregion

        #region //// Methods ///////////

        ////////////////////////////////////////////////////////////////////////////
        public override void Init()
        {
            base.Init();
        }
        ////////////////////////////////////////////////////////////////////////////

        ////////////////////////////////////////////////////////////////////////////
        protected internal override void InitSkin()
        {
            base.InitSkin();
            Skin = new SkinControl(Manager.Skin.Controls[skButton]);
        }
        ////////////////////////////////////////////////////////////////////////////

        ////////////////////////////////////////////////////////////////////////////
        protected override void DrawControl(Renderer renderer, Rectangle rect, GameTime gameTime)
        {
            base.DrawControl(renderer, rect, gameTime);
            if (mode == ButtonMode.PushButton && pushed)
            {
                renderer.Draw(pressImage, rect.X, rect.Y, new Rectangle(0, 0, image.Width, image.Height), Color);
            }
            else
            {
                renderer.Draw(image, rect.X, rect.Y, new Rectangle(0, 0, image.Width, image.Height), Color);
            }
            SkinLayer layer = Skin.Layers[lrButton];
            SpriteFont font = (layer.Text != null && layer.Text.Font != null) ? layer.Text.Font.Resource : null;
            Color col = Color.White;
            int ox = 0; int oy = 0;

            if (ControlState == ControlState.Pressed)
            {
                if (layer.Text != null) col = layer.Text.Colors.Pressed;
                ox = 1; oy = 1;
            }     

        }
        ////////////////////////////////////////////////////////////////////////////

        ////////////////////////////////////////////////////////////////////////////
        private void OnGlyphChanged(EventArgs e)
        {
            if (GlyphChanged != null) GlyphChanged.Invoke(this, e);
        }
        //////////////////////////////////////////////////////////////////////////// 

        //////////////////////////////////////////////////////////////////////////// 
        protected override void OnClick(EventArgs e)
        {
            MouseEventArgs ex = (e is MouseEventArgs) ? (MouseEventArgs)e : new MouseEventArgs();

            if (ex.Button == MouseButton.Left || ex.Button == MouseButton.None)
            {
                pushed = !pushed;
            }

            base.OnClick(e);

            if ((ex.Button == MouseButton.Left || ex.Button == MouseButton.None) && Root != null)
            {
                if (Root is Window)
                {
                    Window wnd = (Window)Root;
                    if (ModalResult != ModalResult.None)
                    {
                        wnd.Close(ModalResult);
                    }
                }
            }
        }
        ////////////////////////////////////////////////////////////////////////////   

        #endregion
    }
}
